<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      /**
       * typeof 可以判断一个变量是number、string、object、function、symbol、boolean、undefined
       * 但是typeof不能判断一个object的数据类型的时候只能告诉我们这个数据是object，不能具体到哪一种object
       */
      var s = new Object('abc')
      console.log(typeof s === 'object')
      console.log(s instanceof String)


      /**
       * instanceof 主要的实现原理就是只要右边变量的 prototype 在左边变量的原型链上即可
       * 因此，instanceof 在查找的过程中会遍历左边变量的原型链，直到找到右边变量的 prototype，
       * 如果查找失败，则会返回false，告诉我们左边变量并非是右边变量的实例
       */
      function new_instance_of(leftValue, rightValue) {
        let rightProto = rightValue.prototype // 取右表达式的 prototype 值
        leftValue = leftValue.__proto__ // 取左表达式的__prototype__值
        while (true) {
          if (leftValue === null) {
            return false
          }
          if (leftValue === rightProto) {
            return true
          }
          leftValue = leftValue.__proto__
        }
      }
      console.log(new_instance_of(s, Boolean));
    </script>
  </body>
</html>
